package xyz.xiaotugou.dataStructure.queue;

/**
 * 
 * @Title:  MyQueue   
 * @Package xyz.xiaotugou.dataStructure   
 * @Description:  自定义循环队列：支持入队、出队操作
 * 				    【循环队列，可以保障head左侧的空间不失去作用】
 * @author: ysy    
 * @date:   2020年9月1日 上午10:40:48  
 * @version V1.0
 */
public class MyLoopQueue {

	// 数据
	private int[] array;
	
	// 头部
    private int head;
    
    // 尾部
    private int tail;
    
    public MyLoopQueue(int capacity){
        this.array = new int[capacity];
    }
    
    /*
     * 入队
     */
    public void enQueue(int element) throws Exception {
    	if((tail+1)%array.length == head){
    		throw new Exception("队列已满！");
    	}
    	array[tail] = element;
    	tail = (tail+1)%array.length;
    }
    
    /*
     * 出队
     */
    public int deQueue() throws Exception {
    	if(tail == head){
    		throw new Exception("队列已空！");
    	}
    	int deQueueElement = array[head];
    	head = (head+1)%array.length;
    	return deQueueElement;
    }
    
    /*
     * 打印队列内容
     */
    private void output() {
    	for(int i=head; i!=tail; i=(i+1)%array.length){
            System.out.println(array[i]);
        }
    }
    
    
    public static void main(String[] args) throws Exception {
    	MyLoopQueue myQueue = new MyLoopQueue(6);
        myQueue.enQueue(3);
        myQueue.enQueue(5);
        myQueue.enQueue(6);
        myQueue.enQueue(8);
        myQueue.enQueue(1);
        myQueue.deQueue();
        myQueue.deQueue();
        myQueue.deQueue();
        myQueue.enQueue(2);
        myQueue.enQueue(4);
        myQueue.enQueue(9);
        myQueue.output();
	}
}
